/**
 * Token服务类
 * 负责token的过期检测、自动登出和token刷新
 */

const { getToken, removeAuthData } = require('./storageUtil.js');
const { http } = require('./http.js');

class TokenService {
  constructor() {
    this.tokenCheckInterval = null;
    this.tokenCheckIntervalMs = 300000; // 每5分钟检查一次token
    this.lastTokenCheck = 0;
    this.isChecking = false;
  }

  /**
   * 启动token过期检测
   */
  startTokenCheck() {
    if (this.tokenCheckInterval) {
      console.log('Token检测服务已在运行中');
      return;
    }

    console.log('启动Token过期检测服务');
    
    // 立即检查一次
    this.checkTokenExpiration();
    
    // 设置定时检查
    this.tokenCheckInterval = setInterval(() => {
      this.checkTokenExpiration();
    }, this.tokenCheckIntervalMs);
  }

  /**
   * 停止token过期检测
   */
  stopTokenCheck() {
    if (this.tokenCheckInterval) {
      clearInterval(this.tokenCheckInterval);
      this.tokenCheckInterval = null;
      console.log('Token检测服务已停止');
    }
  }

  /**
   * 检查token是否过期
   */
  async checkTokenExpiration() {
    // 防止重复检查
    if (this.isChecking) {
      return;
    }

    const token = getToken();
    if (!token) {
      console.log('未找到token，无需检查过期');
      return;
    }

    // 限制检查频率，避免过于频繁的请求
    const now = Date.now();
    if (now - this.lastTokenCheck < 30000) { // 30秒内不重复检查
      return;
    }

    this.isChecking = true;
    this.lastTokenCheck = now;

    try {
      console.log('开始检查token是否过期...');
      
      // 调用后端接口验证token有效性
      const response = await http.get('/getInfo');
      
      if (response && response.user) {
        console.log('Token验证成功，用户信息:', response.user);
        this.isChecking = false;
        return true;
      } else {
        console.log('Token验证失败，响应数据异常');
        this.handleTokenExpired();
        return false;
      }
    } catch (error) {
      console.error('Token验证请求失败:', error);
      
      // 根据错误类型判断是否为token过期
      if (this.isTokenExpiredError(error)) {
        console.log('检测到token过期错误');
        this.handleTokenExpired();
        return false;
      }
      
      this.isChecking = false;
      return false;
    }
  }

  /**
   * 判断错误是否为token过期
   */
  isTokenExpiredError(error) {
    if (!error) return false;
    
    // 检查HTTP状态码
    if (error.code === 401) {
      return true;
    }
    
    // 检查错误消息
    if (error.message) {
      const message = error.message.toLowerCase();
      return message.includes('token') && (
        message.includes('expired') || 
        message.includes('invalid') || 
        message.includes('unauthorized') ||
        message.includes('未授权') ||
        message.includes('过期') ||
        message.includes('无效')
      );
    }
    
    return false;
  }

  /**
   * 处理token过期
   */
  handleTokenExpired() {
    console.log('Token已过期，执行登出操作');
    
    // 清除本地存储
    removeAuthData();
    
    // 停止token检测
    this.stopTokenCheck();
    
    // 显示提示
    wx.showModal({
      title: '登录已过期',
      content: '您的登录已过期，请重新登录',
      showCancel: false,
      confirmText: '确定',
      success: () => {
        // 跳转到登录页
        this.redirectToLogin();
      }
    });
  }

  /**
   * 跳转到登录页
   */
  redirectToLogin() {
    try {
      // 获取当前页面路径
      const pages = getCurrentPages();
      const currentPage = pages[pages.length - 1];
      
      // 如果当前不在登录页，则跳转
      if (currentPage && currentPage.route !== 'my/pages/Login/Login') {
        wx.reLaunch({
          url: '/my/pages/Login/Login'
        });
      }
    } catch (error) {
      console.error('跳转登录页失败:', error);
      // 如果跳转失败，使用switchTab到我的页面
      wx.switchTab({
        url: '/pages/my/my'
      });
    }
  }

  /**
   * 手动检查token（供外部调用）
   */
  async manualCheckToken() {
    return await this.checkTokenExpiration();
  }

  /**
   * 获取token状态信息
   */
  getTokenStatus() {
    const token = getToken();
    return {
      hasToken: !!token,
      tokenLength: token ? token.length : 0,
      isChecking: this.isChecking,
      lastCheck: this.lastTokenCheck,
      serviceRunning: !!this.tokenCheckInterval
    };
  }

  /**
   * 重置服务状态
   */
  reset() {
    this.stopTokenCheck();
    this.isChecking = false;
    this.lastTokenCheck = 0;
  }
}

// 创建单例实例
const tokenService = new TokenService();

module.exports = {
  tokenService,
  TokenService
};
